package com.kinyx.framework.db.daos;

import java.util.List;

import com.kinyx.framework.db.sentence.defines.DeleteResSentence;
import com.kinyx.framework.db.sentence.defines.DeleteSentence;
import com.kinyx.framework.db.sentence.defines.InsertResSentence;
import com.kinyx.framework.db.sentence.defines.InsertSentence;
import com.kinyx.framework.db.sentence.defines.UpdateResSentence;
import com.kinyx.framework.db.sentence.defines.UpdateSentence;
import com.kinyx.framework.db.sentence.str.SQL;
import com.kinyx.framework.enums.impl.ErrorCode1;
import com.kinyx.framework.exception.KRuntimeException;

/**
 * 数据访问定义接口（SQL更新语句）
 */
public interface _Dao_SQL_change extends __Dao {

	/**
	 * INSERT/UPDATE/DELETE
	 * @param dp 数据访问参数
	 * @return 影响的数据行数
	 * @deprecated 用于框架实现类做统一实现，不对外提供使用。
	 */
	@Deprecated
	int change(DaoParam dp);

	/**
	 * INSERT
	 * @param dp 数据访问参数
	 * @param sql INSERT语句
	 * @param params 参数
	 * @return 影响的数据行数
	 * @deprecated {@link #insert(DaoParam, InsertResSentence)}
	 */
	@Deprecated
	default int insert(final DaoParam dp, final String sql, final List<Object> params) {
		if (!sql.startsWith("INSERT")) { throw new KRuntimeException(ErrorCode1.CODE_ERROR_804).param("type", "INSERT").param("SQL", sql); }
		return this.change(DaoParam.of(dp, DMLType.insert).sql(sql).params(params));
	}
	/**
	 * UPDATE
	 * @param dp 数据访问参数
	 * @param sql UPDATE语句
	 * @param params 参数
	 * @return 影响的数据行数
	 * @deprecated {@link #update(DaoParam, UpdateResSentence)}
	 */
	@Deprecated
	default int update(final DaoParam dp, final String sql, final List<Object> params) {
		if (!sql.startsWith("UPDATE")) { throw new KRuntimeException(ErrorCode1.CODE_ERROR_804).param("type", "UPDATE").param("SQL", sql); }
		return this.change(DaoParam.of(dp, DMLType.update).sql(sql).params(params));
	}
	/**
	 * DELETE
	 * @param dp 数据访问参数
	 * @param sql DELETE语句
	 * @param params 参数
	 * @return 影响的数据行数
	 * @deprecated {@link #delete(DaoParam, DeleteResSentence)}
	 */
	@Deprecated
	default int delete(final DaoParam dp, final String sql, final List<Object> params) {
		if (!sql.startsWith("DELETE")) { throw new KRuntimeException(ErrorCode1.CODE_ERROR_804).param("type", "DELETE").param("SQL", sql); }
		return this.change(DaoParam.of(dp, DMLType.delete).sql(sql).params(params));
	}

	/**
	 * INSERT
	 * @param dp 数据访问参数
	 * @param sql INSERT语句
	 * @return 影响的数据行数
	 * @deprecated {@link #insert(DaoParam, InsertResSentence)}
	 */
	@Deprecated
	default int insert(final DaoParam dp, final SQL sql) { return this.insert(dp, sql.getSentence(), sql.getParams()); }
	/**
	 * UPDATE
	 * @param dp 数据访问参数
	 * @param sql UPDATE语句
	 * @return 影响的数据行数
	 * @deprecated {@link #update(DaoParam, UpdateResSentence)}
	 */
	@Deprecated
	default int update(final DaoParam dp, final SQL sql) { return this.update(dp, sql.getSentence(), sql.getParams()); }
	/**
	 * DELETE
	 * @param dp 数据访问参数
	 * @param sql DELETE语句
	 * @return 影响的数据行数
	 * @deprecated {@link #delete(DaoParam, DeleteResSentence)}
	 */
	@Deprecated
	default int delete(final DaoParam dp, final SQL sql) { return this.delete(dp, sql.getSentence(), sql.getParams()); }

	/**
	 * INSERT
	 * @param dp 数据访问参数
	 * @param insert INSERT语句对象
	 * @return 影响的数据行数
	 * @deprecated {@link #insert(DaoParam, InsertResSentence)}
	 */
	@Deprecated
	default int insert(final DaoParam dp, final InsertSentence insert) {
		return this.change(DaoParam.of(dp, DMLType.insert).sql(insert.getSentence()).params(insert.getParams()));
	}
	/**
	 * UPDATE
	 * @param dp 数据访问参数
	 * @param update UPDATE语句对象
	 * @return 影响的数据行数
	 * @deprecated {@link #update(DaoParam, UpdateResSentence)}
	 */
	@Deprecated
	default int update(final DaoParam dp, final UpdateSentence update) {
		return this.change(DaoParam.of(dp, DMLType.update).sql(update.getSentence()).params(update.getParams()));
	}
	/**
	 * DELETE
	 * @param dp 数据访问参数
	 * @param delete DELETE语句对象
	 * @return 影响的数据行数
	 * @deprecated {@link #delete(DaoParam, DeleteResSentence)}
	 */
	@Deprecated
	default int delete(final DaoParam dp, final DeleteSentence delete) {
		return this.change(DaoParam.of(dp, DMLType.delete).sql(delete.getSentence()).params(delete.getParams()));
	}

	/**
	 * INSERT
	 * @param dp 数据访问参数
	 * @param insert INSERT语句对象
	 * @return 影响的数据行数
	 */
	int insert(final DaoParam dp, final InsertResSentence insert);
	/**
	 * UPDATE
	 * @param dp 数据访问参数
	 * @param update UPDATE语句对象
	 * @return 影响的数据行数
	 */
	int update(final DaoParam dp, final UpdateResSentence update);
	/**
	 * DELETE
	 * @param dp 数据访问参数
	 * @param delete DELETE语句对象
	 * @return 影响的数据行数
	 */
	int delete(final DaoParam dp, final DeleteResSentence delete);

}
